﻿USE RapChieuPhim
GO
/*-------------------------------------------
TRANSACTION ERROR
1.TRƯỜNG HỢP LỖI LOST UPDATE

A. HAI GIAO TÁC T1 VÀ T2 CÙNG CẬP NHẬT THÔNG TIN CỦA MỘT NHÂN VIÊN TRONG BẢNG NHÂN VIÊN
---------------------------------------------*/
--T1:
CREATE PROCEDURE [dbo].[sp_CapNhat_NhanVien]
(
	@iMaNhanVien int,
	@sHoTen nvarchar(50),
	@sCMND varchar(12),
	@dNgaySinh date,
	@iGioiTinh int,
	@sDiaChi nvarchar(50),
	@sDienThoai varchar(16),
	@iMaCV int,
	@iMaRap int,
	@sMatKhau char(50)	
)
AS

	BEGIN TRAN
		SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
		IF NOT EXISTS (SELECT * FROM NHANVIEN WHERE MANHANVIEN =@IMANHANVIEN)
			BEGIN
				RAISERROR('ID Không Tồn Tại!',16,1)
			END
		WAITFOR DELAY '00:00:05'
		BEGIN TRY 

			UPDATE NhanVien 
			SET HoTen = @sHoTen,
				CMND = @sCMND,
				NgaySinh = @dNgaySinh,
				GioiTinh = @iGioiTinh,
				DiaChi = @sDiaChi,
				DienThoai = @sDienThoai,
				MaCV = @iMaCV,
				MaRap = @iMaRap ,
				MatKhau = @sMatKhau
			WHERE MaNhanVien = @iMaNhanVien
			COMMIT
		END TRY
		BEGIN CATCH
			ROLLBACK
			DECLARE @ErrorMessage VARCHAR(2000)
			SELECT @ErrorMessage = 'Error: ' + ERROR_MESSAGE()
			RAISERROR(@ErrorMessage, 16, 1)
		END CATCH
	COMMIT TRAN
GO

/*-----------------------------------------------------------
B. HAI GIAO TÁC T1 VÀ T2 CÙNG CẬP NHẬT THÔNG TIN CỦA MỘT BỘ PHIM
------------------------------------------------------------*/

CREATE PROCEDURE [dbo].[sp_CapNhat_Phim]
(
	@iMaPhim int,
	@sTenPhim nvarchar(50),
	@iNamSX int,
	@sNuocSX nchar(15),
	@sHangPhim nchar(15),
	@sGioiThieuPhim ntext,
	@sTrailer nvarchar(50),
	@sPoster nvarchar(50),
	@iThoiLuongPhim int,
	@iMaDDPhim int,
	@sDSDVThamGia ntext
)
AS
BEGIN TRAN
	SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
	IF NOT EXISTS (SELECT * FROM Phim WHERE MaPhim =@iMaPhim)
		BEGIN
			RAISERROR('Bộ phim không tồn tại!',16,1)
		END
	WAITFOR DELAY '00:00:05'
	BEGIN TRY 
			
			UPDATE Phim 
			SET TenPhim = @sTenPhim,
				NamSX = @iNamSX,
				NuocSX  = @sNuocSX,
				HangPhim = @sHangPhim,
				GioiThieuPhim = @sGioiThieuPhim,
				Trailer = @sTrailer,
				Poster = @sPoster,
				ThoiLuongPhim = @iThoiLuongPhim,
				MaDDPhim = @iMaDDPhim,
				DanhSachDVThamGia = @sDSDVThamGia
			WHERE MaPhim = @iMaPhim
		COMMIT
	END TRY
	BEGIN CATCH
		ROLLBACK
		DECLARE @ErrorMessage VARCHAR(2000)
		SELECT @ErrorMessage = 'Error: ' + ERROR_MESSAGE()
		RAISERROR(@ErrorMessage, 16, 1)
	END CATCH
COMMIT TRAN
GO
	
/*-----------------------------------------------------------
C. HAI GIAO TÁC T1 VÀ T2 CÙNG CẬP NHẬT THÔNG TIN CỦA MỘT THÀNH VIÊN
------------------------------------------------------------*/

CREATE PROCEDURE [dbo].[sp_CapNhat_ThanhVien]
(
	@iMaTV int,
	@sTenTV nvarchar (50),
	@sSoDienThoai nchar(15),
	@Email nvarchar(50),
	@sMatKhau nvarchar(32),
	@sCMND nchar(12),
	@iMaDoiTuong int
)
AS

BEGIN TRAN
	SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
	IF NOT EXISTS (SELECT * FROM ThanhVien WHERE MaTV =@iMaTV)
		BEGIN
			RAISERROR('Thành viên không tồn tại!',16,1)
			ROLLBACK
		END
	WAITFOR DELAY '00:00:05'
	BEGIN TRY 
				
		UPDATE ThanhVien 
		SET TenTV = @sTenTV,
			SoDienThoai= @sSoDienThoai,
			Email = @Email,
			MatKhau = @sMatKhau,
			CMND = @sCMND,
			MaDoiTuong = @iMaDoiTuong		
		WHERE MaTV = @iMaTV
	COMMIT
	END TRY
	BEGIN CATCH
		ROLLBACK
		DECLARE @ErrorMessage VARCHAR(2000)
		SELECT @ErrorMessage = 'Error: ' + ERROR_MESSAGE()
		RAISERROR(@ErrorMessage, 16, 1)
	END CATCH
COMMIT TRAN
GO

/*-----------------------------------------------------------
D. HAI GIAO TÁC T1 VÀ T2 CÙNG CẬP NHẬT THÔNG TIN CỦA VÉ
------------------------------------------------------------*/

CREATE PROCEDURE [dbo].[sp_CapNhat_Ve]
(
	 @iMaLoaiVe int,
	 @iMaGhe int,
	 @iMaSuatChieu int,
	 @iMaTV int,
	 @iTrangThai int,	
	 @iMaDoiTuong int
)
AS
BEGIN TRAN
	SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
	DECLARE @mThanhTien money
	DECLARE @tSuatChieu time(7)
	select @tSuatChieu = (select GioBD from SuatChieu where MaSuatChieu = @iMaSuatChieu)
	IF NOT EXISTS  (SELECT * FROM Ve WHERE MaSuatChieu = @iMaSuatChieu AND MaGhe = @iMaGhe)
		BEGIN
			RAISERROR ('Vé không tồn tại',16,1) 
			ROLLBACK
		END
	WAITFOR DELAY '00:00:05'

	IF NOT EXISTS (SELECT MaLoaiVe
				FROM LoaiVe
				WHERE MaLoaiVe = @iMaLoaiVe)
		BEGIN
			RAISERROR('Không tồn tại Mã Loại Vé!',16,1)
			RETURN
		END
	IF NOT EXISTS (SELECT MaGhe
				FROM Ghe
				WHERE MaGhe = @iMaGhe)
		BEGIN
			RAISERROR('Không tồn tại ghế!',16,1)
			RETURN
		END
	IF NOT EXISTS (SELECT MaSuatChieu
				FROM SuatChieu
				WHERE MaSuatChieu = @iMaSuatChieu)
		BEGIN
			RAISERROR('Không tồn tại suất chiếu!',16,1)
			RETURN
		END

	IF ((SELECT TenDinhDang from SuatChieu s,Phim p,DinhDang d where s.MaPhim = p.MaPhim and p.MaDDPhim = d.MaDDPhim and MaSuatChieu = @iMaSuatChieu)= '2D')
		BEGIN
			select @mThanhTien = (Select GiaTien2D from LoaiVe where MaLoaiVe = @iMaLoaiVe)
		END
	ELSE 
		BEGIN
			select @mThanhTien = (Select GiaTien3D from LoaiVe where MaLoaiVe = @iMaLoaiVe)
		END
	IF @tSuatChieu >= '19:00:00.0000000'
		BEGIN
			select @mThanhTien = @mThanhTien * 1.2
		END
	IF (datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 2
	 or	datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 3 
	 OR datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 4 
	 OR datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 5)
		BEGIN
			IF (@tSuatChieu<='17:00:00.0000000')
				BEGIN
					IF(@iMaDoiTuong = 2)
						BEGIN
							DECLARE @TT FLOAT
							SET @TT = (@mThanhTien * (select HeSoGiamGia from DoiTuong where MaDoiTuong = @iMaDoiTuong))
							SET @mThanhTien = @mThanhTien -@TT
						END
				END
		END	
	IF(datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 4
	 or	datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 5 )
		BEGIN
			IF(@iMaTV != -1)
				BEGIN
					DECLARE @TTT FLOAT
					SET @TTT = (@mThanhTien * (select HeSoGiamGia from DoiTuong where MaDoiTuong = @iMaDoiTuong))
					SET @mThanhTien = @mThanhTien -@TTT
				END
		END			

		BEGIN TRY
			UPDATE Ve
			SET MaLoaiVe = @iMaLoaiVe,
				MaTV = @iMaTV,
				TrangThai = @iTrangThai,
				ThanhTien = @mThanhTien,
				MaDoiTuong = @iMaDoiTuong
			WHERE MaSuatChieu = @iMaSuatChieu and MaGhe = @iMaGhe
			COMMIT
		END TRY
		BEGIN CATCH
			ROLLBACK
			DECLARE @ErrorMessage VARCHAR(2000)
			SELECT @ErrorMessage = 'Error: ' + ERROR_MESSAGE()
			RAISERROR(@ErrorMessage, 16, 1)
		END CATCH

GO
/*-------------------------------------------
2.TRƯỜNG HỢP LỖI PHANTOM

A.GIAO TÁC T1 VÀO THỰC HIỆN ĐẾM SỐ LƯỢNG NHÂN VIÊN THEO CHỨC VỤ
GIAO TÁC T2 XEN NGANG THÊM VÀO MỘT NHÂN VIÊN MỚI THEO CHỨC VỤ MÀ T1 ĐANG THỰC HIỆN ĐỌC DỮ LIỆU
---------------------------------------------*/
--T1:
CREATE PROCEDURE [dbo].[sp_PhanTrang_NhanVien]
    @currPage int,
    @recordperpage int,
	@iMaCV int,
    @records int OUTPUT
AS
BEGIN	
	BEGIN TRAN
		DECLARE @SQL VARCHAR(MAX)	
		SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
		IF @iMaCV = 0
			BEGIN
				SELECT @records=COUNT(*) FROM NhanVien
			END
		ELSE
			BEGIN
				SELECT @records=COUNT(*) FROM NhanVien WHERE MaCV=@iMaCV 
			END
		IF  @records = 0
			BEGIN
				RAISERROR('Không có nhân viên!',16,1)
				ROLLBACK
			END
		WAITFOR DELAY '00:00:05'
		IF @iMaCV = 0
			BEGIN
				SET @SQL = 'SELECT * FROM (
					SELECT *, ROW_NUMBER() OVER(ORDER BY MaNhanVien) numrow FROM NhanVien
				) tb,ChucVu cv ,Rap r WHERE tb.MaCV = cv.MaCV AND tb.MaRap=r.MaRap AND numrow BETWEEN ('+CAST(@currPage as varchar)+'-1)*'+CAST(@recordperpage as varchar)+'+1 AND '+CAST(@recordperpage*@currPage as varchar)
			END
		ELSE
			BEGIN
				SET @SQL = 'SELECT * FROM (
					SELECT *, ROW_NUMBER() OVER(ORDER BY MaNhanVien) numrow FROM NhanVien
				) tb,ChucVu cv ,Rap r WHERE tb.MaCV = cv.MaCV AND tb.MaRap=r.MaRap AND tb.MaCV='+CAST(@iMaCV as varchar)+' AND numrow BETWEEN ('+CAST(@currPage as varchar)+'-1)*'+CAST(@recordperpage as varchar)+'+1 AND '+CAST(@recordperpage*@currPage as varchar)
			END
	EXEC(@SQL)
	COMMIT
END
GO
--T2:
CREATE PROCEDURE [dbo].[sp_Them_NhanVien]
(
	--@iMaNhanVien int,
	@sHoTen nvarchar (50),
	@sCMND varchar(12),
	@dNgaySinh datetime,
	@iGioiTinh int,
	@sDiaChi nvarchar(50),
	@sDienThoai varchar(16),
	@iMaCV int,
	@iMaRap int,
	@sMatKhau char(50)
)
AS
BEGIN TRY
	BEGIN TRAN
		DECLARE @FLAGERROR INT
		SET @FLAGERROR = 0
		IF EXISTS (SELECT CMND FROM NhanVien WHERE CMND = @sCMND)
			BEGIN			
				SET @FLAGERROR = 1
			END
		--WAITFOR DELAY '00:00:05'
		INSERT INTO NhanVien VALUES (@sHoTen,@sCMND,@dNgaySinh,@iGioiTinh,@sDiaChi,@sDienThoai,@iMaCV,@iMaRap,@sMatKhau)
		
		IF @FLAGERROR = 1
			BEGIN
				RAISERROR('Số chứng minh này đã tồn tại!',16,1)
				ROLLBACK
				RETURN
			END
		COMMIT TRAN
END TRY
BEGIN CATCH
	ROLLBACK
	DECLARE @ErrorMessage VARCHAR(2000)
	SELECT @ErrorMessage = 'Error: ' + ERROR_MESSAGE()
	RAISERROR(@ErrorMessage, 16, 1)
END CATCH
GO

/*-------------------------------------------
B.GIAO TÁC T1 VÀO THỰC HIỆN ĐẾM SỐ LƯỢNG THÀNH VIÊN THEO LOẠI ĐỐI TƯỢNG
GIAO TÁC T2 XEN NGANG THÊM VÀO MỘT THÀNH VIÊN MỚI THEO LOẠI ĐỐI TƯỢNG MÀ T1 ĐANG THỰC HIỆN ĐỌC DỮ LIỆU
---------------------------------------------*/

--T1:
CREATE PROCEDURE [dbo].[sp_PhanTrang_ThanhVien]
    @currPage int,
    @recordperpage int,
    @iMaDT int,
    @records int OUTPUT
AS
BEGIN	
	BEGIN TRAN
		DECLARE @SQL VARCHAR(MAX)	
		SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
		IF @iMaDT = 0
			BEGIN
				SELECT @records=COUNT(*) FROM ThanhVien
			END
		ELSE
			BEGIN
				SELECT @records=COUNT(*) FROM ThanhVien WHERE MaDoiTuong=@iMaDT 
			END
		IF  @records = 0
			BEGIN
				RAISERROR('Không có nhân viên!',16,1)
				ROLLBACK
			END
		WAITFOR DELAY '00:00:05'
		IF @iMaDT = 0
			BEGIN
				SET @SQL = 'SELECT * FROM (
		SELECT *, ROW_NUMBER() OVER(ORDER BY MaTV) numrow FROM ThanhVien
    ) tb,DoiTuong d WHERE tb.MaDoiTuong=d.MaDoiTuong AND numrow BETWEEN ('+CAST(@currPage as varchar)+'-1)*'+CAST(@recordperpage as varchar)+'+1 AND '+CAST(@recordperpage*@currPage as varchar)
    
			END
		ELSE
			BEGIN
				SET @SQL = 'SELECT * FROM (
		SELECT *, ROW_NUMBER() OVER(ORDER BY MaTV) numrow FROM ThanhVien
    ) tb,DoiTuong d WHERE tb.MaDoiTuong=d.MaDoiTuong AND tb.MaDoiTuong='+CAST(@iMaDT as varchar)+' AND numrow BETWEEN ('+CAST(@currPage as varchar)+'-1)*'+CAST(@recordperpage as varchar)+'+1 AND '+CAST(@recordperpage*@currPage as varchar)
			END
	EXEC(@SQL)
	COMMIT
END
GO

--T2:
CREATE PROCEDURE [dbo].[sp_Them_ThanhVien]
(
	@sTenTV nvarchar (50),
	@sSoDienThoai nchar(15),
	@Email nvarchar(50),
	@sMatKhau nvarchar(32),
	@sCMND nchar(12),
	@iMaDoiTuong int
)
AS
BEGIN TRY
	INSERT INTO ThanhVien 
	VALUES (@sTenTV,@sSoDienThoai,@Email,@sMatKhau,@sCMND,@iMaDoiTuong)
END TRY
BEGIN CATCH
	RAISERROR('Có lỗi xảy ra!',16,1)
END CATCH
GO


/*-------------------------------------------
3.TRƯỜNG HỢP LỖI DIRTY READ

A. - GIAO TÁC T1 VÀO THỰC HIỆN THÊM MỘT THỂ LOẠI PHIM VÀO TRONG BẢNG THỂ LOẠI PHIM, 
NẾU THỂ LOẠI PHIM THÊM VÀO ĐÃ TỒN TẠI TRONG BẢNG THỂ LOẠI PHIM THÌ ROLLBACK
   - GIAO TÁC T2 VÀO LIỆT KÊ DANH SÁCH CÁC THỂ LOẠI PHIM CÓ TRONG BẢNG THỂ LOẠI PHIM
   => GIAO TÁC T2 SẼ ĐỌC LUÔN RECORD MÀ T1 MỚI THÊM VÀO, NHƯNG THỰC CHẤT ĐÓ LÀ DỮ LIỆU RÁC.
---------------------------------------------*/

--T1:
CREATE PROCEDURE [dbo].[sp_Them_TheLoaiPhim]
(
	@sTenTheLoai nvarchar(50)
)
AS
BEGIN TRY
	BEGIN TRAN
		DECLARE @FLAGERROR INT
		SET @FLAGERROR = 0
		IF EXISTS (SELECT * FROM TheLoaiPhim WHERE TenTheLoai = @sTenTheLoai)
			BEGIN			
				SET @FLAGERROR = 1
			END		
		INSERT INTO TheLoaiPhim VALUES (@sTenTheLoai)
		WAITFOR DELAY '00:00:05'
		IF @FLAGERROR = 1
			BEGIN
				RAISERROR('Ten the loai da ton tai!',16,1)				
				ROLLBACK				
				RETURN
			END
		COMMIT TRAN
END TRY
BEGIN CATCH
	ROLLBACK
	DECLARE @ErrorMessage VARCHAR(2000)
	SELECT @ErrorMessage = 'Error: ' + ERROR_MESSAGE()
	RAISERROR(@ErrorMessage, 16, 1)
END CATCH	
GO

--T2:
CREATE PROCEDURE [dbo].[sp_ChonTheLoai]
AS
BEGIN TRAN 
	SET TRANSACTION ISOLATION LEVEL	READ UNCOMMITTED
	SELECT * FROM TheLoaiPhim
COMMIT TRAN
GO

/*-------------------------------------------
B. - GIAO TÁC T1 VÀO THỰC HIỆN THÊM THÔNG TIN MỘT RẠP MỚI VÀO TRONG BẢNG RẠP, 
NẾU THÔNG TIN RẠP VỪA THÊM VÀO ĐÃ TỒN TẠI TRONG BẢNG RẠP THÌ ROLLBACK
   - GIAO TÁC T2 VÀO LIỆT KÊ DANH SÁCH CÁC RẠP CÓ TRONG BẢNG RẠP
   => GIAO TÁC T2 SẼ ĐỌC LUÔN RECORD MÀ T1 MỚI THÊM VÀO, NHƯNG THỰC CHẤT ĐÓ LÀ DỮ LIỆU RÁC.
---------------------------------------------*/

--T1:
CREATE PROCEDURE [dbo].[sp_Them_Rap]
(
	@sTenRap nvarchar(50),
	@sDiaChiRap nvarchar(50)
)
AS	
	DECLARE @FLAG INT
	SET @FLAG = 1
	IF EXISTS (SELECT * FROM Rap WHERE TenRap = @sTenRap)
		BEGIN
			SET @FLAG = 0 
		END
	BEGIN TRAN
	INSERT INTO Rap VALUES (@sTenRap,@sDiaChiRap)
	
	WAITFOR DELAY '00:00:05'
	
	IF  (@FLAG =0)
		BEGIN
			ROLLBACK
			RAISERROR('Tên thể Rạp bị trùng',16,1)
		END
	ELSE
		COMMIT TRAN
		
--T2:
BEGIN TRAN 
	SET TRANSACTION ISOLATION LEVEL	READ UNCOMMITTED
	SELECT * FROM Rap
COMMIT TRAN
GO

/*-------------------------------------------
4. TRƯỜNG HỢP LỖI UNREPEATABLE READ

A. - GIAO TÁC T1 VÀO THỰC HIỆN THỐNG KÊ DOANH THU BÁN VÉ THEO NGÀY TRONG BẢNG VÉ
   - GIAO TÁC T2 VÀO CẬP NHẬT LẠI THÔNG TIN MÃ ĐỐI TƯỢNG CỦA MỘT VÉ CÓ TRONG BẢNG VÉ
   ---------------------------------------------*/

--T1:
CREATE PROC [dbo].[sp_Thongke_Ve]
	@date date,
    @count int OUTPUT
AS
BEGIN TRAN

	SELECT @count=SUM(ThanhTien) FROM Ve, SuatChieu,LoaiVe WHERE Ve.MaLoaiVe=LoaiVe.MaLoaiVe AND Ve.MaSuatChieu=SuatChieu.MaSuatChieu AND SuatChieu.MaSuatChieu IN(SELECT MaSuatchieu FROM SuatChieu Where NgayChieu = @date)
	WAITFOR DELAY '00:00:08'
	SELECT ThanhTien,TenLoaiVe,(SELECT MaGhe FROM LoaiGhe WHERE MaLoaiGhe=(SELECT MaLoaiGhe FROM Ghe WHERE MaGhe = Ve.MaGhe)) as MaGhe, (SELECT TenLoaiGhe FROM LoaiGhe WHERE MaLoaiGhe=(SELECT MaLoaiGhe FROM Ghe WHERE MaGhe = Ve.MaGhe)) as TenGhe ,SuatChieu.MaSuatChieu, Ngaychieu, GioBD,GioKT,TrangThai FROM Ve, SuatChieu,LoaiVe WHERE Ve.MaLoaiVe=LoaiVe.MaLoaiVe AND Ve.MaSuatChieu=SuatChieu.MaSuatChieu AND SuatChieu.MaSuatChieu IN(SELECT MaSuatchieu FROM SuatChieu Where NgayChieu = @date)
COMMIT TRAN
GO
--T2:
CREATE PROCEDURE [dbo].[sp_CapNhat_Ve]
(
	 @iMaLoaiVe int,
	 @iMaGhe int,
	 @iMaSuatChieu int,
	 @iMaTV int,
	 @iTrangThai int,	
	 @iMaDoiTuong int
)
AS
BEGIN TRAN
	SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
	DECLARE @mThanhTien money
	DECLARE @tSuatChieu time(7)
	select @tSuatChieu = (select GioBD from SuatChieu WITH(UPDLOCK) where MaSuatChieu = @iMaSuatChieu)
	IF NOT EXISTS  (SELECT * FROM Ve WHERE MaSuatChieu = @iMaSuatChieu AND MaGhe = @iMaGhe)
		BEGIN
			RAISERROR ('Vé không tồn tại',16,1) 
			ROLLBACK
		END
	WAITFOR DELAY '00:00:05'

	IF NOT EXISTS (SELECT MaLoaiVe
				FROM LoaiVe
				WHERE MaLoaiVe = @iMaLoaiVe)
		BEGIN
			RAISERROR('Không tồn tại Mã Loại Vé!',16,1)
			RETURN
		END
	IF NOT EXISTS (SELECT MaGhe
				FROM Ghe
				WHERE MaGhe = @iMaGhe)
		BEGIN
			RAISERROR('Không tồn tại ghế!',16,1)
			RETURN
		END
	IF NOT EXISTS (SELECT MaSuatChieu
				FROM SuatChieu
				WHERE MaSuatChieu = @iMaSuatChieu)
		BEGIN
			RAISERROR('Không tồn tại suất chiếu!',16,1)
			RETURN
		END

	IF ((SELECT TenDinhDang from SuatChieu s,Phim p,DinhDang d where s.MaPhim = p.MaPhim and p.MaDDPhim = d.MaDDPhim and MaSuatChieu = @iMaSuatChieu)= '2D')
		BEGIN
			select @mThanhTien = (Select GiaTien2D from LoaiVe where MaLoaiVe = @iMaLoaiVe)
		END
	ELSE 
		BEGIN
			select @mThanhTien = (Select GiaTien3D from LoaiVe where MaLoaiVe = @iMaLoaiVe)
		END
	IF @tSuatChieu >= '19:00:00.0000000'
		BEGIN
			select @mThanhTien = @mThanhTien * 1.2
		END
	IF (datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 2
	 or	datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 3 
	 OR datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 4 
	 OR datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 5)
		BEGIN
			IF (@tSuatChieu<='17:00:00.0000000')
				BEGIN
					IF(@iMaDoiTuong = 2)
						BEGIN
							DECLARE @TT FLOAT
							SET @TT = (@mThanhTien * (select HeSoGiamGia from DoiTuong where MaDoiTuong = @iMaDoiTuong))
							SET @mThanhTien = @mThanhTien -@TT
						END
				END
		END	
	IF(datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 4
	 or	datepart(dw,(SELECT NgayChieu from SuatChieu where MaSuatChieu = @iMaSuatChieu)) = 5 )
		BEGIN
			IF(@iMaTV != -1)
				BEGIN
					DECLARE @TTT FLOAT
					SET @TTT = (@mThanhTien * (select HeSoGiamGia from DoiTuong where MaDoiTuong = @iMaDoiTuong))
					SET @mThanhTien = @mThanhTien -@TTT
				END
		END			

		BEGIN TRY
			UPDATE Ve
			SET MaLoaiVe = @iMaLoaiVe,
				MaTV = @iMaTV,
				TrangThai = @iTrangThai,
				ThanhTien = @mThanhTien,
				MaDoiTuong = @iMaDoiTuong
			WHERE MaSuatChieu = @iMaSuatChieu and MaGhe = @iMaGhe
			COMMIT
		END TRY
		BEGIN CATCH
			ROLLBACK
			DECLARE @ErrorMessage VARCHAR(2000)
			SELECT @ErrorMessage = 'Error: ' + ERROR_MESSAGE()
			RAISERROR(@ErrorMessage, 16, 1)
		END CATCH
GO
/*-------------------------------------------
B. - GIAO TÁC T1 VÀO THỰC HIỆN LIỆT KÊ DANH SÁCH NHÂN VIÊN THEO CHỨC VỤ
   - GIAO TÁC T2 VÀO CẬP NHẬT LẠI THÔNG TIN CHỨC VỤ CỦA MỘT NHÂN VIÊN TRONG BẢNG NHANVIEN T1 ĐANG QUAN TÂM TỚI CHỨC VỤ ĐÓ
   ---------------------------------------------*/
   --T1:
CREATE PROCEDURE [dbo].[sp_PhanTrang_NhanVien]
    @currPage int,
    @recordperpage int,
	@iMaCV int,
    @records int OUTPUT
AS
	BEGIN TRAN
		DECLARE @SQL VARCHAR(MAX)
		IF @iMaCV = 0
			BEGIN
				SELECT @records=COUNT(*) FROM NhanVien
			END
		ELSE
			BEGIN
				SELECT @records=COUNT(*) FROM NhanVien WHERE MaCV=@iMaCV 
			END
		IF  @records = 0
			BEGIN
				RAISERROR('Không có nhân viên!',16,1)
				RETURN
			END
		WAITFOR DELAY '00:00:05'
		IF @iMaCV = 0
			BEGIN
				SET @SQL = 'SELECT * FROM (
					SELECT *, ROW_NUMBER() OVER(ORDER BY MaNhanVien) numrow FROM NhanVien
				) tb,ChucVu cv ,Rap r WHERE tb.MaCV = cv.MaCV AND tb.MaRap=r.MaRap AND numrow BETWEEN ('+CAST(@currPage as varchar)+'-1)*'+CAST(@recordperpage as varchar)+'+1 AND '+CAST(@recordperpage*@currPage as varchar)
			END
		ELSE
			BEGIN
				SET @SQL = 'SELECT * FROM (
					SELECT *, ROW_NUMBER() OVER(ORDER BY MaNhanVien) numrow FROM NhanVien
				) tb,ChucVu cv ,Rap r WHERE tb.MaCV = cv.MaCV AND tb.MaRap=r.MaRap AND tb.MaCV='+CAST(@iMaCV as varchar)+' AND numrow BETWEEN ('+CAST(@currPage as varchar)+'-1)*'+CAST(@recordperpage as varchar)+'+1 AND '+CAST(@recordperpage*@currPage as varchar)
			END
		EXEC(@SQL)
	COMMIT
GO
   
   
   
   --T2:
CREATE PROCEDURE [dbo].[sp_CapNhat_ChucVu]
	@iMaCV int,
	@sTenCV nvarchar(50)
AS
IF EXISTS(SELECT MaCV FROM ChucVu WHERE MaCV=@iMaCV)
BEGIN
	UPDATE ChucVu SET TenChucVu = @sTenCV
	WHERE MaCV = @iMaCV
END
ELSE
BEGIN
	RAISERROR('Chức vụ không tồn tại!',16,1)
END
GO

/*-------------------------------------------
C. - GIAO TÁC T1 VÀO THỰC HIỆN LIỆT KÊ DANH SÁCH CÁC THÀNH VIÊN CÓ TRONG BẢNG THÀNH VIÊN THEO ĐỐI TƯỢNG
   - GIAO TÁC T2 VÀO CẬP NHẬT LẠI THÔNG TIN MÃ ĐỐI TƯỢNG CỦA MỘT THÀNH VIÊN TRONG BẢNG THANHVIEN T1 ĐANG QUAN TÂM TỚI ĐỐI TƯỢNG ĐÓ
   ---------------------------------------------*/
   --T1:
 CREATE PROCEDURE [dbo].[sp_PhanTrang_ThanhVien]
    @currPage int,
    @recordperpage int,
    @iMaDT int,
    @records int OUTPUT
AS
BEGIN	
	BEGIN TRAN
		DECLARE @SQL VARCHAR(MAX)	

		IF @iMaDT = 0
			BEGIN
				SELECT @records=COUNT(*) FROM ThanhVien
			END
		ELSE
			BEGIN
				SELECT @records=COUNT(*) FROM ThanhVien WHERE MaDoiTuong=@iMaDT 
			END
		IF  @records = 0
			BEGIN
				RAISERROR('Không có nhân viên!',16,1)
				ROLLBACK
			END
		WAITFOR DELAY '00:00:05'
		IF @iMaDT = 0
			BEGIN
				SET @SQL = 'SELECT * FROM (
		SELECT *, ROW_NUMBER() OVER(ORDER BY MaTV) numrow FROM ThanhVien
    ) tb,DoiTuong d WHERE tb.MaDoiTuong=d.MaDoiTuong AND numrow BETWEEN ('+CAST(@currPage as varchar)+'-1)*'+CAST(@recordperpage as varchar)+'+1 AND '+CAST(@recordperpage*@currPage as varchar)
    
			END
		ELSE
			BEGIN
				SET @SQL = 'SELECT * FROM (
		SELECT *, ROW_NUMBER() OVER(ORDER BY MaTV) numrow FROM ThanhVien
    ) tb,DoiTuong d WHERE tb.MaDoiTuong=d.MaDoiTuong AND tb.MaDoiTuong='+CAST(@iMaDT as varchar)+' AND numrow BETWEEN ('+CAST(@currPage as varchar)+'-1)*'+CAST(@recordperpage as varchar)+'+1 AND '+CAST(@recordperpage*@currPage as varchar)
			END
	EXEC(@SQL)
	COMMIT
END

GO
   
   --T2:
CREATE PROCEDURE [dbo].[sp_CapNhat_ThanhVien]
(
	@iMaTV int,
	@sTenTV nvarchar (50),
	@sSoDienThoai nchar(15),
	@Email nvarchar(50),
	@sMatKhau nvarchar(32),
	@sCMND nchar(12),
	@iMaDoiTuong int
)
AS
BEGIN TRAN	
		BEGIN TRY
		UPDATE ThanhVien 
		SET TenTV = @sTenTV,
			SoDienThoai= @sSoDienThoai,
			Email = @Email,
			MatKhau = @sMatKhau,
			CMND = @sCMND,
			MaDoiTuong = @iMaDoiTuong		
		WHERE MaTV = @iMaTV
		WAITFOR DELAY '00:00:05'
		IF(SELECT COUNT(*) FROM ThanhVien WHERE CMND =@sCMND) >=2
			BEGIN
				RAISERROR('Số chứng minh đã tồn tại!', 16, 1)
				ROLLBACK
				RETURN
			END
	COMMIT
	END TRY
	BEGIN CATCH
		ROLLBACK
		DECLARE @ErrorMessage VARCHAR(2000)
		SELECT @ErrorMessage = 'Error: ' + ERROR_MESSAGE()
		RAISERROR(@ErrorMessage, 16, 1)
	END CATCH
